package cn.yanxiaohui.service.web.mq.worker.fair;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;

import java.io.IOException;
/**
 * 工作模式消息消费者2（公平调度）
 *      使用prefetchcount = 1的设置来调用BasicQos方法
 *      这个方法告诉RabbitMQ在同一时间不要发送多于一个消息的数据给某个【Worker】。
 *      或者，当某个消息处理完毕，并且已经收到了消息确认之后，才可以继续发送消息给那个【Worker】。
 *      相反，它将把消息分配给给下一个不忙的【Worker】。
 * @author yanxh
 */
public class FairWorkerRecv2 {
    private final static String QUEUE_NAME = "ChongDongOrder";

    public static void main(String[] args) throws IOException, Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("chongdong");
        factory.setVirtualHost("saibeideyu");
        factory.setPassword("chongdong");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        System.out.println("消费者2连接消息中间件");
        channel.basicQos(0, 1, false);
        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列，手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);
        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" [x] Received '" + message + "'");
            //休眠
            Thread.sleep(1000);
            // 返回确认状态
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }


}
